namespace Study601 {


  // Partial 将T中的所有属性设置为可选

  type Person = {
    name: string,
    age: number
  }

  type Person2 = Partial<Person>


  // Pick  从类型定义T的属性中，选取指定一组属性，返回一个新的类型定义
  type Person3 = {
    name: string,
    age: number,
    text: string
    address: string
  }

  // 要求1：使用Pick 抽取 "name" | "age" 属性 ， 并且使用交叉类型新增 e 属性
  // 要求2：让新类型的属性变为可选
  type person4 = Partial<Pick<Person3, "name" | "age"> & {
    e: string;
  }>

  let objp4: person4 = {
    age: 23,
    e: '23424',
    name: '2323'
  }



  interface User {
    id: number;
    name: string;
    email: string;
    password: string;
  }
  // 使用 Omit 排除 user的 password 属性，并使用交叉类型 新增 sex 属性
  type OmitUser = Omit<User, "password"> & {
    sex: string
  }


  let oUserData: OmitUser = {
    email: 'str',
    id: 10001,
    name: 'changsheng',
    sex: 'nan'
  }





  // Readonly 和Partial 很像，只是把? 替换成了 Readonly

  type Person5 = {
    name: string,
    age: number,
    text: string
    address: string
  }

  type person6 = Readonly<Person5>



  // Record
  //定义传入的值
  type Persona = {
    name: string,
    age: number,
    text: string
  }
  //定义可传入的健
  type K = "a" | "b" | "c"

  type newobj2 = Record<K, Persona>


  class Student3 {

    constructor(
      public name: string,
      public age: number
    ) { }
  }

  // 键：使用 Persona 属性作为键值 值：传入Student3对象  按照这个需求声明一个对象类型

  type StuType = Record<keyof Persona, Student3>

  let stuData: StuType = {
    age: new Student3('changsheng', 22),
    name: new Student3('changsheng', 22),
    text: new Student3('changsheng', 22),
  }





  // type NewObj = {
  //   a: Persona
  //   b: Persona
  //   c: Persona
  // }



}